package com.cencat.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.order.entity.Delivery;
import com.cencat.order.vo.DeliveryVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 配送跟踪数据访问层接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Mapper
public interface DeliveryMapper extends BaseMapper<Delivery> {

    /**
     * 分页查询配送列表
     *
     * @param page 分页参数
     * @param deliveryCode 配送编号(模糊查询)
     * @param orderCode 订单编号(模糊查询)
     * @param driverCode 司机编号(模糊查询)
     * @param deliveryStatus 配送状态
     * @param deliveryType 配送类型
     * @param priority 优先级
     * @param merchantCode 商家编号
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 配送分页列表
     */
    IPage<DeliveryVO> selectDeliveryPage(Page<DeliveryVO> page,
                                       @Param("deliveryCode") String deliveryCode,
                                       @Param("orderCode") String orderCode,
                                       @Param("driverCode") String driverCode,
                                       @Param("deliveryStatus") Integer deliveryStatus,
                                       @Param("deliveryType") String deliveryType,
                                       @Param("priority") Integer priority,
                                       @Param("merchantCode") String merchantCode,
                                       @Param("startTime") LocalDateTime startTime,
                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 根据配送编号查询配送信息
     *
     * @param deliveryCode 配送编号
     * @return 配送信息
     */
    DeliveryVO selectByDeliveryCode(@Param("deliveryCode") String deliveryCode);

    /**
     * 根据订单编号查询配送信息
     *
     * @param orderCode 订单编号
     * @return 配送信息列表
     */
    List<DeliveryVO> selectByOrderCode(@Param("orderCode") String orderCode);

    /**
     * 根据司机编号查询配送信息
     *
     * @param driverCode 司机编号
     * @param deliveryStatus 配送状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送信息列表
     */
    List<DeliveryVO> selectByDriverCode(@Param("driverCode") String driverCode,
                                      @Param("deliveryStatus") Integer deliveryStatus,
                                      @Param("startTime") LocalDateTime startTime,
                                      @Param("endTime") LocalDateTime endTime);

    /**
     * 根据商家编号查询配送信息
     *
     * @param merchantCode 商家编号
     * @param deliveryStatus 配送状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送信息列表
     */
    List<DeliveryVO> selectByMerchantCode(@Param("merchantCode") String merchantCode,
                                        @Param("deliveryStatus") Integer deliveryStatus,
                                        @Param("startTime") LocalDateTime startTime,
                                        @Param("endTime") LocalDateTime endTime);

    /**
     * 查询实时配送跟踪信息
     *
     * @param deliveryId 配送ID
     * @return 实时跟踪信息
     */
    Map<String, Object> selectRealTimeTrackingInfo(@Param("deliveryId") Long deliveryId);

    /**
     * 查询配送轨迹信息
     *
     * @param deliveryId 配送ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送轨迹列表
     */
    List<Map<String, Object>> selectDeliveryTrackingPath(@Param("deliveryId") Long deliveryId,
                                                        @Param("startTime") LocalDateTime startTime,
                                                        @Param("endTime") LocalDateTime endTime);

    /**
     * 查询配送统计信息
     *
     * @param deliveryId 配送ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> selectDeliveryStatistics(@Param("deliveryId") Long deliveryId,
                                                @Param("startTime") LocalDateTime startTime,
                                                @Param("endTime") LocalDateTime endTime);

    /**
     * 更新配送状态
     *
     * @param deliveryId 配送ID
     * @param deliveryStatus 配送状态
     * @param statusTime 状态时间
     * @param updateTime 更新时间
     * @param remark 备注
     * @return 更新行数
     */
    int updateDeliveryStatus(@Param("deliveryId") Long deliveryId,
                            @Param("deliveryStatus") Integer deliveryStatus,
                            @Param("statusTime") LocalDateTime statusTime,
                            @Param("updateTime") LocalDateTime updateTime,
                            @Param("remark") String remark);

    /**
     * 更新配送位置信息
     *
     * @param deliveryId 配送ID
     * @param currentLongitude 当前经度
     * @param currentLatitude 当前纬度
     * @param currentAddress 当前地址
     * @param locationTime 位置时间
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliveryLocation(@Param("deliveryId") Long deliveryId,
                              @Param("currentLongitude") BigDecimal currentLongitude,
                              @Param("currentLatitude") BigDecimal currentLatitude,
                              @Param("currentAddress") String currentAddress,
                              @Param("locationTime") LocalDateTime locationTime,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新配送时间信息
     *
     * @param deliveryId 配送ID
     * @param pickupTime 取货时间
     * @param deliveryTime 配送时间
     * @param arrivalTime 到达时间
     * @param completeTime 完成时间
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliveryTimeInfo(@Param("deliveryId") Long deliveryId,
                              @Param("pickupTime") LocalDateTime pickupTime,
                              @Param("deliveryTime") LocalDateTime deliveryTime,
                              @Param("arrivalTime") LocalDateTime arrivalTime,
                              @Param("completeTime") LocalDateTime completeTime,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新配送签收信息
     *
     * @param deliveryId 配送ID
     * @param signRecipient 签收人
     * @param signTime 签收时间
     * @param signPhoto 签收照片
     * @param signRemark 签收备注
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliverySignInfo(@Param("deliveryId") Long deliveryId,
                              @Param("signRecipient") String signRecipient,
                              @Param("signTime") LocalDateTime signTime,
                              @Param("signPhoto") String signPhoto,
                              @Param("signRemark") String signRemark,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新配送费用信息
     *
     * @param deliveryId 配送ID
     * @param actualDistance 实际距离
     * @param actualDuration 实际时长
     * @param deliveryFee 配送费用
     * @param extraFee 额外费用
     * @param totalFee 总费用
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliveryFeeInfo(@Param("deliveryId") Long deliveryId,
                             @Param("actualDistance") BigDecimal actualDistance,
                             @Param("actualDuration") Integer actualDuration,
                             @Param("deliveryFee") BigDecimal deliveryFee,
                             @Param("extraFee") BigDecimal extraFee,
                             @Param("totalFee") BigDecimal totalFee,
                             @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新配送异常信息
     *
     * @param deliveryId 配送ID
     * @param exceptionType 异常类型
     * @param exceptionReason 异常原因
     * @param exceptionTime 异常时间
     * @param handleStatus 处理状态
     * @param handleResult 处理结果
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliveryExceptionInfo(@Param("deliveryId") Long deliveryId,
                                   @Param("exceptionType") String exceptionType,
                                   @Param("exceptionReason") String exceptionReason,
                                   @Param("exceptionTime") LocalDateTime exceptionTime,
                                   @Param("handleStatus") Integer handleStatus,
                                   @Param("handleResult") String handleResult,
                                   @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新配送评价信息
     *
     * @param deliveryId 配送ID
     * @param rating 评分
     * @param comment 评价内容
     * @param ratingTime 评价时间
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliveryRating(@Param("deliveryId") Long deliveryId,
                            @Param("rating") Integer rating,
                            @Param("comment") String comment,
                            @Param("ratingTime") LocalDateTime ratingTime,
                            @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量更新配送状态
     *
     * @param deliveryIds 配送ID列表
     * @param deliveryStatus 配送状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchUpdateDeliveryStatus(@Param("deliveryIds") List<Long> deliveryIds,
                                 @Param("deliveryStatus") Integer deliveryStatus,
                                 @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询配送成功率统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param deliveryType 配送类型
     * @param driverCode 司机编号
     * @return 成功率统计信息
     */
    Map<String, Object> selectDeliverySuccessRateStatistics(@Param("startTime") LocalDateTime startTime,
                                                           @Param("endTime") LocalDateTime endTime,
                                                           @Param("deliveryType") String deliveryType,
                                                           @Param("driverCode") String driverCode);

    /**
     * 查询配送效率统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param driverCode 司机编号
     * @return 效率统计信息
     */
    Map<String, Object> selectDeliveryEfficiencyStatistics(@Param("startTime") LocalDateTime startTime,
                                                          @Param("endTime") LocalDateTime endTime,
                                                          @Param("driverCode") String driverCode);

    /**
     * 查询配送时间分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 时间分布统计信息
     */
    List<Map<String, Object>> selectDeliveryTimeDistributionStatistics(@Param("startTime") LocalDateTime startTime,
                                                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 查询配送类型分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 类型分布统计信息
     */
    List<Map<String, Object>> selectDeliveryTypeDistributionStatistics(@Param("startTime") LocalDateTime startTime,
                                                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 查询配送地区分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 地区分布统计信息
     */
    List<Map<String, Object>> selectDeliveryRegionDistributionStatistics(@Param("startTime") LocalDateTime startTime,
                                                                         @Param("endTime") LocalDateTime endTime);

    /**
     * 查询配送异常统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param exceptionType 异常类型
     * @return 异常统计信息
     */
    List<Map<String, Object>> selectDeliveryExceptionStatistics(@Param("startTime") LocalDateTime startTime,
                                                               @Param("endTime") LocalDateTime endTime,
                                                               @Param("exceptionType") String exceptionType);

    /**
     * 查询配送评价统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param driverCode 司机编号
     * @return 评价统计信息
     */
    Map<String, Object> selectDeliveryRatingStatistics(@Param("startTime") LocalDateTime startTime,
                                                      @Param("endTime") LocalDateTime endTime,
                                                      @Param("driverCode") String driverCode);

    /**
     * 查询配送距离统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param driverCode 司机编号
     * @return 距离统计信息
     */
    Map<String, Object> selectDeliveryDistanceStatistics(@Param("startTime") LocalDateTime startTime,
                                                        @Param("endTime") LocalDateTime endTime,
                                                        @Param("driverCode") String driverCode);

    /**
     * 查询配送费用统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param merchantCode 商家编号
     * @return 费用统计信息
     */
    Map<String, Object> selectDeliveryFeeStatistics(@Param("startTime") LocalDateTime startTime,
                                                   @Param("endTime") LocalDateTime endTime,
                                                   @Param("merchantCode") String merchantCode);

    /**
     * 查询配送热力图数据
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param deliveryType 配送类型
     * @return 热力图数据
     */
    List<Map<String, Object>> selectDeliveryHeatmapData(@Param("startTime") LocalDateTime startTime,
                                                       @Param("endTime") LocalDateTime endTime,
                                                       @Param("deliveryType") String deliveryType);

    /**
     * 查询配送路径优化建议
     *
     * @param deliveryId 配送ID
     * @return 路径优化建议
     */
    List<Map<String, Object>> selectDeliveryPathOptimizationSuggestions(@Param("deliveryId") Long deliveryId);

    /**
     * 查询配送预警信息
     *
     * @param deliveryId 配送ID
     * @return 预警信息列表
     */
    List<Map<String, Object>> selectDeliveryWarnings(@Param("deliveryId") Long deliveryId);

    /**
     * 查询配送质量评估
     *
     * @param deliveryId 配送ID
     * @return 质量评估信息
     */
    Map<String, Object> selectDeliveryQualityAssessment(@Param("deliveryId") Long deliveryId);

    /**
     * 软删除配送信息
     *
     * @param deliveryId 配送ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int softDeleteDelivery(@Param("deliveryId") Long deliveryId,
                          @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量软删除配送信息
     *
     * @param deliveryIds 配送ID列表
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchSoftDeleteDeliveries(@Param("deliveryIds") List<Long> deliveryIds,
                                 @Param("updateTime") LocalDateTime updateTime);

    /**
     * 恢复已删除的配送信息
     *
     * @param deliveryId 配送ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int restoreDelivery(@Param("deliveryId") Long deliveryId,
                       @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询配送操作日志
     *
     * @param deliveryId 配送ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> selectDeliveryOperationLogs(@Param("deliveryId") Long deliveryId,
                                                         @Param("startTime") LocalDateTime startTime,
                                                         @Param("endTime") LocalDateTime endTime,
                                                         @Param("limit") Integer limit);
}